//
// Created by HeiBai on 2020/6/13.
//

#include "JNICallback.h"
#include "macro.h"

JNICallback::JNICallback(JavaVM *javaVm, JNIEnv *jniEnv, jobject instance) {
    this->javaVm = javaVm;
    this->jniEnv = jniEnv;
    //jniEnv在跨线程的时候不能使用
    //instance 可能被释放了，需要使用全局引用
    this->instance = jniEnv->NewGlobalRef(instance);

    jclass myPlayerClass = jniEnv->GetObjectClass(this->instance);
    //使用的是MyPlayer.java中的方法
    const char *prepareSign = "()V";
    this->jmd_prepared = jniEnv->GetMethodID(myPlayerClass, "onPrepared", prepareSign);
    const char *errorSign = "(I)V";
    this->jmd_error = jniEnv->GetMethodID(myPlayerClass, "onError", errorSign);


}

JNICallback::~JNICallback() {
    this->javaVm = 0;
    this->jniEnv->DeleteGlobalRef(this->instance);
    this->instance = 0;
    this->jniEnv = 0;
};

//可能是主线程 异步线程
void JNICallback::onPrepared(int thread_mode) {
    if (thread_mode == THREAD_MAIN) {
        //主线程，可以使用env
        this->jniEnv->CallVoidMethod(this->instance, this->jmd_prepared);
    } else if (thread_mode == THREAD_CHILD) {
        //子线程， 不能使用env，开启 附加线程,javaVm附加
        JNIEnv *env = nullptr;
        int ret = this->javaVm->AttachCurrentThread(&env, 0);
        if (ret != JNI_OK) {
            return;
        }
        env->CallVoidMethod(this->instance, jmd_prepared);
        //解除附加
        this->javaVm->DetachCurrentThread();
    }
}

//可能是主线程 异步线程
void JNICallback::onErrorAction(int thread_mode, int error_code) {
    if (thread_mode == THREAD_MAIN) {
        //主线程，可以使用env
        this->jniEnv->CallVoidMethod(this->instance, this->jmd_error);
    } else if (thread_mode == THREAD_CHILD) {
        //子线程， 不能使用env，开启 附加线程,javaVm附加
        JNIEnv *env = nullptr;
        int ret = this->javaVm->AttachCurrentThread(&env, 0);
        if (ret != JNI_OK) {
            return;
        }
        env->CallVoidMethod(this->instance, jmd_error);
        //解除附加
        this->javaVm->DetachCurrentThread();
    }
}
